<?php
/**
 * Ly - 系统视图类
 *
 * 模板视图实例化，参数传递，模板解析后输出至浏览器
 *
 * Copyright (c) 2013 YinHailin All rights reserved.
 * @Author: YinHailin
 * @Authorize: Boren Network
 * @Created by YinHailin at 2013-11-01
 */

defined('LY_VERSION') or exit();

class ViewCore {

  /* 模板变量 */
  private $TempVar = array();

  /* 模板引擎 */
  private $TempEngine = null;

  /* 初始化模板引擎 */
  private function _InitTempEngine() {
    //模板引擎实例创建
    if (!is_object($this->TempEngine)) $this->TempEngine = LyCore::Instance(C('TEMP_ENGINE_TYPE'));
  }

  /*
   * 模板变量赋值
   * @param string|array $name 要赋值的变量
   * @param string $value 变量的值
   */
  public function Assign($name, $value = '') {
    if (is_array($name)) {
      $this->TempVar = array_merge($this->TempVar, $name);
    } else {
      $this->TempVar[$name] = $value;
    }
  }

  /*
   * 加载解析模板
   * @param string $templateFile 模板文件
   * @param string $prefix  模板缓存文件前缀
   * @param string $charset  模板字符集
   * @param string $contentType  输出类型
   */
  public function Display($templateFile = '', $prefix = '', $charset = '', $contentType = '') {
    //初始化模板引擎
    $this->_InitTempEngine();
    //获取文件真实路径
    $templateFile = $this->_LocationTemplate($templateFile);
    //解析并获取模板内容
    $file = $this->TempEngine->Fetch($templateFile, $this->TempVar, $prefix);
    //输出模板内容
    $this->Output($file);
  }

  /*
   * 获取解析模板
   * @param string $templateFile 模板文件
   * @param string $prefix  模板缓存文件前缀
   * @param string $charset  模板字符集
   * @param string $contentType  输出类型
   * @return string
   */
  public function Fetch($templateFile = '', $prefix = '', $charset = '', $contentType = '') {
    //初始化模板引擎
    $this->_InitTempEngine();
    //获取文件真实路径
    $templateFile = $this->_LocationTemplate($templateFile);
    //解析并获取模板内容
    $file = $this->TempEngine->Fetch($templateFile, $this->TempVar, $prefix);
    //获取模板内容
    return $this->GetContent($file);
  }

  /*
   * 获取模板文件真实路径
   * @param string $templateFile 模板文件
   * @return string
   */
  private function _LocationTemplate($templateFile) {
    $templateFile = str_replace('\\', '/', $templateFile);
    if (empty($templateFile)) {
      //空文件名模式
      if (defined('PLUGIN_NAME')) {
        //判断为插件调用
        $templateFile = PLUGIN_PATH.PLUGIN_NAME.'/Tpl/'.ACTION_NAME.C('TEMP_TEMPLATE_SUFFIX');
      } else {
        //判断为普通调用
        $templateFile = TPL_PATH.MODULE_NAME.'/'.ACTION_NAME.C('TEMP_TEMPLATE_SUFFIX');
      }
    } elseif (substr($templateFile, 1, 2) == ':/' || substr($templateFile, 0, 1) == '/') {
      //绝对路径不作处理
    } elseif (substr($templateFile, 0, 1) == '.') {
      //相对于项目的全路径
      $templateFile = TPL_PATH.$templateFile;
    } elseif (strpos($templateFile, ':')) {
      //模块名：行为名模式
      $templateFile = str_replace(':', '/', $templateFile);
      $templateFile = TPL_PATH.$templateFile.C('TEMP_TEMPLATE_SUFFIX');
    } else {
      //行为名模式
      $templateFile = TPL_PATH.MODULE_NAME.'/'.$templateFile.C('TEMP_TEMPLATE_SUFFIX');
    }
    return $templateFile;
  }

  /*
   * 输出模板内容
   * @param string $file 模板路径
   * @param string $charset 字符集
   * @param string $contentType 输出类型
   */
  public function Output($file, $charset = '', $contentType = '') {
    if(empty($charset)) $charset = C('DEFAULT_CHARSET');
    if(empty($contentType)) $contentType = C('TEMP_CONTENT_TYPE');
    //网页字符编码
    header('Content-Type:'.$contentType.'; charset='.$charset);
    header('Cache-control: '.C('HTTP_CACHE_CONTROL'));  // 页面缓存控制
    header('X-Powered-By:LyPHP');
    //模板阵列变量分解成为独立变量
    extract($this->TempVar, EXTR_OVERWRITE);
    //输出模板文件
    if (is_file($file)) { include $file;}
  }

  /*
   * 获取模板内容
   * @param string $file 模板路径
   * @param string $charset 字符集
   * @param string $contentType 输出类型
   * @return string
   */
  public function GetContent($file, $charset = '', $contentType = '') {
    if(empty($charset)) $charset = C('DEFAULT_CHARSET');
    if(empty($contentType)) $contentType = C('TEMP_CONTENT_TYPE');
    //开启缓冲
    ob_start();
    ob_implicit_flush(false);
    //网页字符编码
    header('Content-Type:'.$contentType.'; charset='.$charset);
    header('Cache-control: '.C('HTTP_CACHE_CONTROL'));  // 页面缓存控制
    header('X-Powered-By:LyPHP');
    //模板阵列变量分解成为独立变量
    extract($this->TempVar, EXTR_OVERWRITE);
    //输出模板文件
    if (is_file($file)) { include $file;}
    $content = ob_get_clean();
    //ob_end_flush();
    return $content;
  }
}